from py2neo import Graph
import pandas as pd
import os
from dotenv import load_dotenv
load_dotenv()

def node_to_dict_with_Id(node):
    return {
        "identity": node.identity,
        "labels": list(node.labels),
        "properties": dict(node)
    }

# 1 Neo4j 连接
NEO4J_URI = os.getenv("NEO4J_URI")
NEO4J_USER = os.getenv("NEO4J_USER")
NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD")
graph = Graph(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))
print("✅ 连接Neo4j成功" if graph.run("RETURN 1").data() else "❌ 连接Neo4j失败")




# 2 核心逻辑
# 2.1 读取标准工序文件（使用指定路径）
standard_process_file = os.path.join("data", "标准工序.csv")
df = pd.read_csv(standard_process_file)
print(f"✅ 读取标准工序文件，共 {len(df)} 条记录")

# 2.2 构建映射（*标准工序名称 -> *标准工序编码）
match_col = "*标准工序名称"       # 用于匹配的列
mpm_id_col = "*标准工序编码"       # 作为mpm_id的列
assert match_col in df.columns, f"❌ 缺少列: {match_col}"
assert mpm_id_col in df.columns, f"❌ 缺少列: {mpm_id_col}"

# 构建名称到编码的映射（过滤空值）
process_map = {
    row[match_col]: row[mpm_id_col]
    for _, row in df.iterrows()
    if pd.notna(row[match_col]) and pd.notna(row[mpm_id_col])
}
print(f"✅ 构建映射完成，共 {len(process_map)} 条有效数据")

# 2.3 查询所有工序节点
nodes = [node_to_dict_with_Id(record["n"]) for record in graph.run("MATCH (n:`工序`) RETURN n")]
print(f"✅ 查询到 {len(nodes)} 个工序节点")

# 2.4 匹配并添加mpm_id属性
updated = 0
for node in nodes:
    node_id = node["identity"]
    proc_name = node["properties"].get("工序名称")  # 节点中存储名称的属性
    
    if not proc_name:
        print(f"⚠️ 节点 {node_id} 无'工序名称'属性，跳过")
        continue
    
    mpm_id = process_map.get(proc_name)
    if mpm_id:
        graph.run("MATCH (n) WHERE id(n) = $id SET n.mpm_id = $mpm", id=node_id, mpm=mpm_id)
        updated += 1
        print(f"✅ 节点 {node_id} 添加mpm_id: {mpm_id}")
    else:
        print(f"⚠️ 节点 {node_id} 名称'{proc_name}'无匹配的标准工序编码")

print(f"\n处理完成，共更新 {updated} 个节点")